package com.itheima.service;

import org.apache.commons.lang.StringUtils;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * @Author weizhongli
 * @Date 2020/4/28
 * @Version v1.0
 * @Description 自定义全局过滤器
 * 实现全局过滤器的接口GlobaFilter，Ordered
 * 注意：自定义过滤器比粗注入Spring容器中
 **/
@Component
public class MyGloableFilter implements GlobalFilter, Ordered {

    /**
     * 拦截所有的http请求：经过网关的http请求
     *
     * @param exchange 交换器
     * @param chain    网关的过滤器栈
     * @return
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        /**
         * 从请求中获取参数，token
         * 判断token是否存在
         * 如果存在，放行
         * 如果不存在，拦截，提示用户未授权
         */
        //1.请求对象
        ServerHttpRequest request = exchange.getRequest();
        //2.响应对象
        ServerHttpResponse response = exchange.getResponse();
        //3.从请求对象中，获取请求参数token
        String token = request.getQueryParams().getFirst("token");
        //4.判断请求是否存在
        if(StringUtils.isEmpty(token)){
            //如果不存在，进行权限拦截 提示用户未授权
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            return response.setComplete(); //进行拦截
        }
        //如果存在，放行
        return chain.filter(exchange);
    }



    /**
     *方法的返回值，决定了当前拦截器在拦截器栈中的执行顺序
     * 返回值越小，执行顺序越靠前！
     */
    @Override
    public int getOrder() {
        return 0;
    }
}
